#include "shutdown_screen.h"
#include "device_state_manager.h"
#include "smart_home_ui.h"  // 添加智能家居界面头文件
#include "light_control.h"  // 添加灯光控制头文件
#include "led_control.h"    // 添加LED控制头文件
#include "myfont.h"
#include <stdio.h>
#include <stdlib.h>

// 全局变量
static lv_obj_t *shutdown_screen = NULL;
static lv_obj_t *goodbye_label = NULL;
static lv_obj_t *home_icon = NULL;
static lv_obj_t *progress_arc = NULL;
static lv_obj_t *status_label = NULL;

// 鼠标设备相关
static lv_indev_t *mouse_device = NULL;

// 动画相关
static lv_timer_t *shutdown_timer = NULL;
static lv_timer_t *progress_timer = NULL;
static lv_timer_t *blackscreen_timer = NULL;
static int shutdown_progress = 0;
static shutdown_complete_cb_t shutdown_complete_callback = NULL;

// 动画回调函数声明
static void goodbye_fade_in_cb(lv_anim_t *a);
static void icon_fade_out_cb(lv_anim_t *a);
static void progress_update_cb(lv_timer_t *timer);
static void shutdown_complete_cb(lv_timer_t *timer);
static void blackscreen_complete_cb(lv_timer_t *timer);

// 自定义动画执行回调
static void zoom_anim_cb(void *obj, int32_t v) {
    lv_obj_set_style_transform_zoom((lv_obj_t*)obj, v, LV_PART_MAIN);
}

static void opa_anim_cb(void *obj, int32_t v) {
    lv_obj_set_style_opa((lv_obj_t*)obj, v, LV_PART_MAIN);
}

// 设置关机完成回调
void set_shutdown_complete_callback(shutdown_complete_cb_t callback) {
    shutdown_complete_callback = callback;
}

// 设置鼠标输入设备
void set_mouse_indev(lv_indev_t *mouse_indev) {
    mouse_device = mouse_indev;
}

// 告别文字淡入动画完成回调
static void goodbye_fade_in_cb(lv_anim_t *a) {
    // 启动图标淡出和缩小动画
    if(home_icon && lv_obj_is_valid(home_icon)) {
        // 图标淡出动画
        lv_anim_t fade_anim;
        lv_anim_init(&fade_anim);
        lv_anim_set_var(&fade_anim, home_icon);
        lv_anim_set_values(&fade_anim, LV_OPA_COVER, LV_OPA_30);  // 从完全可见到30%透明度
        lv_anim_set_time(&fade_anim, 800);
        lv_anim_set_exec_cb(&fade_anim, opa_anim_cb);
        lv_anim_set_path_cb(&fade_anim, lv_anim_path_ease_in);
        lv_anim_start(&fade_anim);
        
        // 图标缩小动画
        lv_anim_t scale_anim;
        lv_anim_init(&scale_anim);
        lv_anim_set_var(&scale_anim, home_icon);
        lv_anim_set_values(&scale_anim, 100, 30);  // 从100%缩放到30%
        lv_anim_set_time(&scale_anim, 800);
        lv_anim_set_exec_cb(&scale_anim, zoom_anim_cb);
        lv_anim_set_path_cb(&scale_anim, lv_anim_path_ease_in);
        lv_anim_set_ready_cb(&scale_anim, icon_fade_out_cb);
        lv_anim_start(&scale_anim);
    }
}

// 图标淡出动画完成回调
static void icon_fade_out_cb(lv_anim_t *a) {
    // 启动进度条动画
    if(progress_arc && lv_obj_is_valid(progress_arc) && 
       status_label && lv_obj_is_valid(status_label)) {
        lv_obj_clear_flag(progress_arc, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(status_label, LV_OBJ_FLAG_HIDDEN);
        
        // 启动进度更新定时器
        progress_timer = lv_timer_create(progress_update_cb, 60, NULL);
    }
}

// 进度更新回调
static void progress_update_cb(lv_timer_t *timer) {
    static bool state_saved = false;  // 确保只保存一次状态
    
    if(!progress_arc || !lv_obj_is_valid(progress_arc) ||
       !status_label || !lv_obj_is_valid(status_label)) {
        if(timer) lv_timer_del(timer);
        return;
    }
    
    shutdown_progress += 3;  // 每次增加3%
    
    if(shutdown_progress <= 100) {
        // 更新进度条
        lv_arc_set_value(progress_arc, shutdown_progress);
        
        // 更新状态文字
        char status_text[32];
        if(shutdown_progress < 25) {
            snprintf(status_text, sizeof(status_text), "保存数据... %d%%", shutdown_progress);
            // 在保存数据阶段实际保存设备状态（只保存一次）
            if(shutdown_progress >= 15 && !state_saved) {
                // 保存用户设置到 smart_home_settings.txt（包含四个灯的状态）
                save_user_settings();
                
                // 保存完整设备状态到系统状态文件
                if(save_device_states()) {
                    // 设备状态保存成功
                } else {
                    // 设备状态保存失败
                }
                state_saved = true;
            }
        } else if(shutdown_progress < 50) {
            snprintf(status_text, sizeof(status_text), "关闭设备... %d%%", shutdown_progress);
            // 在关闭设备阶段关闭所有四个灯
            static bool lights_turned_off = false;
            if(shutdown_progress >= 30 && !lights_turned_off) {
                // 关闭所有LED硬件
                led_set_state(LED1_GPIO, false);  // 关闭客厅灯
                led_set_state(LED2_GPIO, false);  // 关闭卧室灯
                led_set_state(LED3_GPIO, false);  // 关闭厨房灯
                led_set_state(LED4_GPIO, false);  // 关闭阳台灯
                
                // 更新软件状态
                set_light_state(0, false);  // 客厅灯
                set_light_state(1, false);  // 卧室灯
                set_light_state(2, false);  // 厨房灯
                set_light_state(3, false);  // 阳台灯
                
                lights_turned_off = true;
            }
        } else if(shutdown_progress < 75) {
            snprintf(status_text, sizeof(status_text), "断开连接... %d%%", shutdown_progress);
        } else if(shutdown_progress < 95) {
            snprintf(status_text, sizeof(status_text), "系统关闭... %d%%", shutdown_progress);
        } else {
            snprintf(status_text, sizeof(status_text), "再见总裁... %d%%", shutdown_progress);
        }
        lv_label_set_text(status_label, status_text);
    } else {
        // 进度完成，停止定时器
        lv_timer_del(timer);
        progress_timer = NULL;
        
        // 延迟1秒后关闭程序
        shutdown_timer = lv_timer_create(shutdown_complete_cb, 1000, NULL);
    }
}

// 关机完成回调
static void shutdown_complete_cb(lv_timer_t *timer) {
    lv_timer_del(timer);
    shutdown_timer = NULL;
    
    printf("关机动画完成，显示黑屏...\n");
    
    // 隐藏鼠标光标
    if(mouse_device) {
        printf("准备隐藏鼠标光标...\n");
        
        // 方法1：创建一个完全透明且隐藏的光标
        lv_obj_t *hidden_cursor = lv_obj_create(NULL);
        lv_obj_set_size(hidden_cursor, 1, 1);  // 最小尺寸
        lv_obj_set_style_bg_opa(hidden_cursor, LV_OPA_TRANSP, LV_PART_MAIN);  // 完全透明
        lv_obj_set_style_border_opa(hidden_cursor, LV_OPA_TRANSP, LV_PART_MAIN);  // 边框也透明
        lv_obj_set_style_shadow_opa(hidden_cursor, LV_OPA_TRANSP, LV_PART_MAIN);  // 阴影也透明
        lv_obj_clear_flag(hidden_cursor, LV_OBJ_FLAG_CLICKABLE);  // 不可点击
        lv_obj_add_flag(hidden_cursor, LV_OBJ_FLAG_HIDDEN);  // 设置隐藏标志
        
        // 设置隐藏光标
        lv_indev_set_cursor(mouse_device, hidden_cursor);
        printf("鼠标光标已隐藏\n");
    } else {
        printf("警告：鼠标设备为空，无法隐藏光标\n");
    }
    
    // 创建黑屏
    lv_obj_t *black_screen = lv_obj_create(NULL);
    lv_obj_set_style_bg_color(black_screen, lv_color_hex(0x000000), LV_PART_MAIN);  // 纯黑色
    lv_obj_set_style_bg_opa(black_screen, LV_OPA_COVER, LV_PART_MAIN);
    lv_obj_clear_flag(black_screen, LV_OBJ_FLAG_SCROLLABLE);
    
    // 切换到黑屏，没有动画效果以确保立即显示
    lv_scr_load(black_screen);
    
    // 强制刷新显示
    lv_obj_invalidate(black_screen);
    lv_refr_now(lv_disp_get_default());
    
    // 清理关机界面
    cleanup_shutdown_screen();
    
    // 延迟2秒后退出程序，确保黑屏显示完整
    blackscreen_timer = lv_timer_create(blackscreen_complete_cb, 2000, NULL);
}

// 黑屏完成回调，最终退出程序
static void blackscreen_complete_cb(lv_timer_t *timer) {
    lv_timer_del(timer);
    blackscreen_timer = NULL;
    
    printf("黑屏显示完成，程序退出...\n");
    
    // 调用关机完成回调或直接退出程序
    if(shutdown_complete_callback) {
        shutdown_complete_callback();
    } else {
        exit(0);  // 直接退出程序
    }
}

// 创建关机界面
void create_shutdown_screen(void) {
    // 重置进度
    shutdown_progress = 0;
    
    // 创建关机屏幕
    shutdown_screen = lv_obj_create(NULL);
    lv_obj_set_style_bg_color(shutdown_screen, lv_color_hex(0x1a1a2e), LV_PART_MAIN);  // 深蓝色背景
    lv_obj_set_style_bg_opa(shutdown_screen, LV_OPA_COVER, LV_PART_MAIN);
    lv_obj_clear_flag(shutdown_screen, LV_OBJ_FLAG_SCROLLABLE);
    
    // 加载屏幕
    lv_scr_load_anim(shutdown_screen, LV_SCR_LOAD_ANIM_FADE_ON, 300, 0, false);
    
    // 创建告别文字（初始透明）
    goodbye_label = lv_label_create(shutdown_screen);
    lv_label_set_text(goodbye_label, "总裁,期待您的归来!");
    lv_obj_set_style_text_font(goodbye_label, &lv_font_source_han_sans_bold_20, LV_PART_MAIN);
    lv_obj_set_style_text_color(goodbye_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN);
    lv_obj_align(goodbye_label, LV_ALIGN_CENTER, 0, -80);
    lv_obj_set_style_opa(goodbye_label, LV_OPA_TRANSP, LV_PART_MAIN);  // 初始透明
    
    // 创建家居图标
    home_icon = lv_label_create(shutdown_screen);
    lv_label_set_text(home_icon, LV_SYMBOL_HOME);
    lv_obj_set_style_text_font(home_icon, &lv_font_montserrat_20, LV_PART_MAIN);
    lv_obj_set_style_text_color(home_icon, lv_color_hex(0xe74c3c), LV_PART_MAIN);  // 红色，表示关机
    lv_obj_align(home_icon, LV_ALIGN_CENTER, 0, -20);
    lv_obj_set_style_transform_zoom(home_icon, 100, LV_PART_MAIN);  // 初始100%大小
    
    // 创建进度圆环（初始隐藏）
    progress_arc = lv_arc_create(shutdown_screen);
    lv_obj_set_size(progress_arc, 120, 120);
    lv_obj_align(progress_arc, LV_ALIGN_CENTER, 0, 60);
    lv_arc_set_range(progress_arc, 0, 100);
    lv_arc_set_value(progress_arc, 0);
    lv_arc_set_bg_angles(progress_arc, 0, 360);
    lv_obj_set_style_arc_width(progress_arc, 8, LV_PART_MAIN);
    lv_obj_set_style_arc_color(progress_arc, lv_color_hex(0x34495e), LV_PART_MAIN);
    lv_obj_set_style_arc_width(progress_arc, 8, LV_PART_INDICATOR);
    lv_obj_set_style_arc_color(progress_arc, lv_color_hex(0xe74c3c), LV_PART_INDICATOR);  // 红色进度条
    lv_obj_add_flag(progress_arc, LV_OBJ_FLAG_HIDDEN);  // 初始隐藏
    
    // 移除进度圆环的旋钮
    lv_obj_set_style_bg_opa(progress_arc, LV_OPA_TRANSP, LV_PART_KNOB);
    lv_obj_set_style_pad_all(progress_arc, 0, LV_PART_KNOB);
    
    // 禁用用户拖动交互
    lv_obj_clear_flag(progress_arc, LV_OBJ_FLAG_CLICKABLE);
    
    // 创建状态文字（初始隐藏）
    status_label = lv_label_create(shutdown_screen);
    lv_label_set_text(status_label, "准备关机... 0%");
    lv_obj_set_style_text_font(status_label, &lv_font_source_han_sans_bold_20, LV_PART_MAIN);
    lv_obj_set_style_text_color(status_label, lv_color_hex(0xBDC3C7), LV_PART_MAIN);  // 浅灰色
    lv_obj_align(status_label, LV_ALIGN_CENTER, 0, 140);
    lv_obj_add_flag(status_label, LV_OBJ_FLAG_HIDDEN);  // 初始隐藏
    
    // 启动告别文字淡入动画
    lv_anim_t fade_anim;
    lv_anim_init(&fade_anim);
    lv_anim_set_var(&fade_anim, goodbye_label);
    lv_anim_set_values(&fade_anim, LV_OPA_TRANSP, LV_OPA_COVER);
    lv_anim_set_time(&fade_anim, 1000);
    lv_anim_set_exec_cb(&fade_anim, opa_anim_cb);
    lv_anim_set_path_cb(&fade_anim, lv_anim_path_ease_in_out);
    lv_anim_set_ready_cb(&fade_anim, goodbye_fade_in_cb);
    lv_anim_start(&fade_anim);
}

// 清理关机界面
void cleanup_shutdown_screen(void) {
    // 清理定时器
    if(shutdown_timer) {
        lv_timer_del(shutdown_timer);
        shutdown_timer = NULL;
    }
    if(progress_timer) {
        lv_timer_del(progress_timer);
        progress_timer = NULL;
    }
    if(blackscreen_timer) {
        lv_timer_del(blackscreen_timer);
        blackscreen_timer = NULL;
    }
    
    // 重置全局指针
    goodbye_label = NULL;
    home_icon = NULL;
    progress_arc = NULL;
    status_label = NULL;
    shutdown_screen = NULL;
    
    // 重置鼠标设备引用
    mouse_device = NULL;
    
    // 重置进度
    shutdown_progress = 0;
}
